From eea8d9917c1a9f8c4f7b854015cebe7932e35ea6 Mon Sep 17 00:00:00 2001 From: parkrrrr Date: Thu, 29 Jan 2004 22:04:03 +0000 Subject: [PATCH] Added utf8 to CP1252 conversion function to util.c --- gpsbabel/defs.h | 1 + gpsbabel/util.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ gpsbabel/waypt.c | 10 +++++++-- 3 files changed, 62 insertions(+), 2 deletions(-) diff --git a/gpsbabel/defs.h b/gpsbabel/defs.h index c263c02f3..8df876115 100644 --- a/gpsbabel/defs.h +++ b/gpsbabel/defs.h @@ -388,6 +388,7 @@ void rtrim(char *s); signed int get_tz_offset(void); const char *get_cache_icon(const waypoint *waypointp); char * xml_entitize(const char * str); +char * str_utf8_to_cp1252( const char * str ); /* * PalmOS records like fixed-point numbers, which should be rounded diff --git a/gpsbabel/util.c b/gpsbabel/util.c index a89f96a4f..a8d562445 100644 --- a/gpsbabel/util.c +++ b/gpsbabel/util.c @@ -638,6 +638,59 @@ dodefault: } } +char * str_utf8_to_cp1252( const char * str ) +{ + char *result = xstrdup( str ); + char *cur = result; + + while ( cur && *cur ) { + if ( *cur & 0x80 ) { + int bytes; + int value; + utf8_to_int( cur, &bytes, &value ); + if ( value > 0xff ) { + switch (value) { + case 0x20AC: value = 0x80; break; + case 0x201A: value = 0x82; break; + case 0x0192: value = 0x83; break; + case 0x201E: value = 0x84; break; + case 0x2026: value = 0x85; break; + case 0x2020: value = 0x86; break; + case 0x2021: value = 0x87; break; + case 0x02C6: value = 0x88; break; + case 0x2030: value = 0x89; break; + case 0x0160: value = 0x8A; break; + case 0x2039: value = 0x8B; break; + case 0x0152: value = 0x8C; break; + case 0x017D: value = 0x8E; break; + case 0x2018: value = 0x91; break; + case 0x2019: value = 0x92; break; + case 0x201C: value = 0x93; break; + case 0x201D: value = 0x94; break; + case 0x2022: value = 0x95; break; + case 0x2013: value = 0x96; break; + case 0x2014: value = 0x97; break; + case 0x02DC: value = 0x98; break; + case 0x2122: value = 0x99; break; + case 0x0161: value = 0x9A; break; + case 0x203A: value = 0x9B; break; + case 0x0153: value = 0x9C; break; + case 0x017E: value = 0x9E; break; + case 0x0178: value = 0x9F; break; + // default is the generic "currency + // sign" because question marks + // just look stupid. + default: value = 0xA4; break; + } + } + *cur = (char)value; + strcpy( cur+1, cur+bytes ); + } + cur++; + } + return result; +} + char * xml_entitize(const char * str) { int elen, ecount, nsecount; diff --git a/gpsbabel/waypt.c b/gpsbabel/waypt.c index 32710c729..17e3cb301 100644 --- a/gpsbabel/waypt.c +++ b/gpsbabel/waypt.c @@ -123,16 +123,22 @@ waypt_count(void) void waypt_disp(const waypoint *wpt) { + char *tmpdesc = NULL; if (wpt->creation_time) { printf("%s ", ctime(&wpt->creation_time)); } printposn(wpt->latitude,1); printposn(wpt->longitude,0); + + tmpdesc = str_utf8_to_cp1252( wpt->description); printf("%s/%s", global_opts.synthesize_shortnames ? - mkshort(mkshort_handle, wpt->description) : + mkshort(mkshort_handle, tmpdesc) : wpt->shortname, - wpt->description); + tmpdesc); + if ( tmpdesc ) + xfree(tmpdesc); + if (wpt->altitude != unknown_alt) printf(" %f", wpt->altitude); printf("\n"); -- 2.30.2